/**
 * @author hewei
 * @version 1.0
 * @description: 794. 有效的井字游戏
 * @date 2022/8/25 14:48
 */

public class ValidTicTacToe {

    public boolean validTicTacToe(String[] board) {
        int[][] temp = new int[3][3];
        int x = 0;
        int y = 0;
        for (int j = 0; j < board.length; ++j) {
            String s = board[j];
            for (int i = 0; i < 3; i++) {
                char c = s.charAt(i);
                if (c == 'O') {
                    temp[j][i] = 2;
                    ++y;
                } else if (c == 'X') {
                    ++x;
                    temp[j][i] = 1;
                }
            }
        }
        if (y > x || x - y > 1) return false;
        for (int i = 0; i < 3; i++) {
            if (i == 0 && temp[0][i] != 0) {
                if (temp[0][0] == temp[0][1] && temp[0][0] == temp[0][2]) {
                    if (temp[0][0] == 1) {
                        if (x == y) return false;
                    } else if (x > y) return false;
                }
                if (temp[0][0] == temp[1][0] && temp[0][0] == temp[2][0]) {
                    if (temp[0][0] == 1) {
                        if (x == y) return false;
                    } else if (x > y) return false;
                }
                if (temp[0][0] == temp[1][1] && temp[0][0] == temp[2][2]) {
                    if (temp[0][0] == 1) {
                        if (x == y) return false;
                    } else if (x > y) return false;
                }
            } else if (i == 1 && temp[0][i] != 0) {
                if (temp[0][1] == temp[1][1] && temp[1][1] == temp[2][1]) {
                    if (temp[0][1] == 1) {
                        if (x == y) return false;
                    } else if (x > y) return false;
                }
            } else if (i == 2 && temp[0][2] != 0) {
                if (temp[0][2] == temp[1][2] && temp[0][2] == temp[2][2]) {
                    if (temp[0][2] == 1) {
                        if (x == y) return false;
                    } else if (x > y) return false;
                }
                if (temp[0][2] == temp[1][1] && temp[1][1] == temp[2][0]) {
                    if (temp[0][2] == 1) {
                        if (x == y) return false;
                    } else if (x > y) return false;
                }
            }
        }
        if (temp[1][0] != 0 && (temp[1][0] == temp[1][1] && temp[1][1] == temp[1][2])) {
            if (temp[1][0] == 1) {
                if (x == y) return false;
            } else if (x > y) return false;
        }
        if (temp[2][0] != 0 && temp[2][0] == temp[2][1] && temp[2][2] == temp[2][0]) {
            if (temp[2][0] == 1) {
                if (x == y) return false;
            } else if (x > y) return false;
        }
        return true;
    }
}
